{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## I. Queue\n",
    "----"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Xem thêm về [Queue](https://www.tutorialspoint.com/python/python_queue.htm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Queue](https://lh3.googleusercontent.com/MUPO5y4HVEphBra4KkSALE8QUUtPCATFqQjGew0zLBol0mF-lvbxO-PPqExpQ5RM6FdQRQvc13FM4zc5C_l91u_asj170yLDaBuScvg91DoyZEvDrlJDIWbeDPuiTCLjOo3mf5f0FsC2JY0Vq2lsFYjQrF9mUMcmMpIwMn5-V_WO5FWXnDSl8936msIcrO8H24ZTeRyEZMlWcdZz9Vg_QFPLXb34WJN7xn_YGYJh5w0kOv_vOgiODHPQxQyif9p_6sd5kafGFuDa89j4vyX3vQOp1p5sChYS5nFyzDZuhf2480k8asl1ySbtbpnf88FdMEoZnFsCvRThWrDcUmba-mp-2wcaq3U0WSRCXf97IKK7ll2_bdBHiqM2I4ACxuujCYtAIb-ADGk3mVP9XHsjqwGdXG5R6ns0wGw6FjykZV7Kg3PLT2AbHfR07IF3pfn570V7DcTqiUj-5elRU027AarZqgexg1zjlSnMz9tOmQV_mhztEBQub7XQfw1hZcRYyEr_jhYeMRR38U8oqgFqywJJEmSWArb7a6U2gZEqdpM9GmuyMv0mHJ2kcYR2TjeKWbGb2la9bGVNt97sRc1tFvBAvOjWagsmEybdmTuzE2BnaTrCutAxSGFhU3QoUoLs0M9s6Gmvb_g8avcQTG45_C99glBM4jJH-A=w1300-h289-no)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Queue trong Tiếng Việt là hàng đợi, đặc điểm nổi bật của Queue là **FIFO (First In First Out)**. Khi thêm một phần tử vào Queue thì phần tử đó sẽ được thêm vào cuối Queue và khi lấy ra một phần tử khỏi Queue thì phần tử được lấy ra là phần tử đầu tiên của Queue.\n",
    "\n",
    "Hãy liên tưởng đến việc bạn đi siêu thị bạn đến xếp hàng trước bạn sẽ được phục vụ trước, bạn đến sau bạn sẽ được phục vụ sau, điều này ngược hoàn toàn với Stack. Bạn có thể xem kỹ về [Stack](https://github.com/bangoc123/learn-machine-learning-in-two-months/blob/master/python-tutorials/stack.ipynb) tại đây."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Queue](https://lh3.googleusercontent.com/gQGEQSzDIeVLAAjBBzPIYh1VPyMS-dlGZg6e4-DWPF90OWzyQATIF1fOcdWRYg7F9yIVxviEDIvELAduRhTbgfmc2HLeYWHvrCOAblJc3Mc0H728UPFeOPci_B3sAoupWw4W9yTjDy0-Pm1fxiBQtfyUBUhbd58mRwESjluKK2aFgQ0KZLkz1BXwCljt8_jE1IUaNcQv2N5DWJll4v_at4NOg3lhiiRLujUzrc6gnYHVkd55ecdelnY26lAe3cZfyb-XgrNFmvUOhBvnVXOgw7w7OHF3X-oPNyUqCToob4E511jvayCl7mlxtkUGapr1ED5iWfaD1pwe0TzxS_UGqnJVzrrSlcerx7mb7EBpLEhC3zGZaL7sA4ETd0NzaXEcId36hbzHfKdQyWFqCiEMsLSSCsYFnP_HILoY5jcCZNeVIpZgp0WlwJl8RAly7E3Wo_8jpADUpZahWNmFUy4rpw7qud4S9ZZeR2WvijQM0bw3mijJ7Mc02jE4CQ6bTMwtjmH7v4vn_Mw1xSCagr88-lC144zru504TIxQOOqZzR64pd6OJdTcUjsHIIufIGsnqgao5nCSTqJyaqYayoH215Afj-EGHpxs5s9H3_WQJR5VeWUZHuqMfHkyj945sYK35y5TB7wpjZcY86w1IxhMVeZdTu8Ggq9fYg=w450-h315-no)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Khởi tạo một Queue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Khởi tạo một Queue với một biến thực thể là một List rỗng\n",
    "class Queue:\n",
    "    def __init__(self):\n",
    "        self.queue = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "queue1 = Queue()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "queue1.queue"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Enqueue và Dequeue"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Enque và Dequeue](https://lh3.googleusercontent.com/7CqHXd5xjRWS4vx2g1LM9FQgwY0M5Rn0sY5qX8FMtmcyIHdl77hMKxvbhGV9fnygkC7rMhCtjZdJUOHp57E38_nqw4BUWR0qucKmZs9r22cmIZC_xh1GFw4b51qel8F6Pis3bmkTCeCJ69HJrgHoBjNMLJuDwKLu7nY3WjcpW1MtXR0oUlG1ve_l2-YMoU8JTkFu-uEcl6vMU38ZeJYFAooJOG6rjkQ-kZJR9jUPEUKBqNCy7M6_DvK1LYB8Iu1TyP2oNRUWPvybNN2xL68dPFGyZpb37jzZC3nbefjkNd_rMQZQ0vbvcNRXXvIeosYQgC06FO_3koAIQXQ8AJZ3GDcawWWBiaFN8b36jMWRuFzwHYhi-MNAuapTLuBc_C6Fo8fFDqeJ2ANQfgyhU-Ec8I44t23ZhHV7AC9u15i7Zw2n9R5qB5hw528Kt5qbb9x6Vw9m1PkcE_nUP51sXIw0JQmSexFio_XlCULZN0TlNh4AWDZoM2P8BNkLce3i-gZ4CgKayNR4edgLYU8V6sQ9LpSw9mOZIlLuJWXwFUmbICUONxsyCGNrj2bJ5QkDTyViqtV6HU0wWRGxdH5YvrTk_Dqt9Jdy_uNhip_sUOMfxNRSubZeOIMIB2UhgcDfpr0Pjk1eG9kYuNxUiNMvENBwsfzBfvoMGat0mg=w1203-h815-no)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Enqueue** là thêm một phần tử vào Queue, phần tử này sẽ nằm cuối cùng trong Queue"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Dequeue** là xóa đi một phần tử của Queue và phần tử này sẽ là phần tử đầu tiên của Queue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Queue:\n",
    "    def __init__(self):\n",
    "        self.queue = []\n",
    "    # Thêm một phần tử vào Queue\n",
    "    def enqueue(self, elem):\n",
    "        self.queue.append(elem)\n",
    "    # Xóa một phần tử khỏi Queue\n",
    "    def dequeue(self):\n",
    "        if len(self.queue) > 0:\n",
    "            self.queue.pop(0)\n",
    "        else:\n",
    "            print \"Queue is empty\"\n",
    "            \n",
    "    def printAllElems(self):\n",
    "        if len(self.queue) > 0:\n",
    "            for elem in self.queue:\n",
    "                print elem\n",
    "        else:\n",
    "            print \"Queue is empty\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "queue2 = Queue()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Thêm 4 phần tử vào Queue\n",
    "queue2.enqueue(\"Monday\")\n",
    "queue2.enqueue(\"Tuesday\")\n",
    "queue2.enqueue(\"Wednesday\")\n",
    "queue2.enqueue(\"Thursday\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Monday\n",
      "Tuesday\n",
      "Wednesday\n",
      "Thursday\n"
     ]
    }
   ],
   "source": [
    "queue2.printAllElems()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "queue2.dequeue()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tuesday\n",
      "Wednesday\n",
      "Thursday\n"
     ]
    }
   ],
   "source": [
    "# Monday được thêm vào đầu tiên nên khi dequeue là Monday được ra khỏi Queue đầu tiên\n",
    "queue2.printAllElems()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "queue2.dequeue()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wednesday\n",
      "Thursday\n"
     ]
    }
   ],
   "source": [
    "queue2.printAllElems()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
